package com.spzx.product.controller;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.github.pagehelper.PageHelper;
import com.spzx.common.core.exception.ServiceException;
import com.spzx.common.core.web.controller.BaseController;
import com.spzx.common.core.web.domain.AjaxResult;
import com.spzx.common.core.web.page.TableDataInfo;
import com.spzx.product.domain.Product;
import com.spzx.product.domain.ProductSku;
import com.spzx.product.query.SkuQuery;
import com.spzx.product.service.*;
import com.spzx.product.vo.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;

@Tag(name = "聚合数据")
@RestController
@RequestMapping("/channel")
@Slf4j
public class ChannelController extends BaseController {

    @Autowired
    private ICategoryService categoryService;

    @Autowired
    private IProductSkuService productSkuService;

    @Autowired
    private IBrandService brandService;

    @Autowired
    private IProductService productService;
    @Autowired
    private ISkuStockService skuStockService;
    @Autowired
    private IProductDetailsService productDetailsService;

    @Autowired
    private RedisTemplate redisTemplate;


    @Operation(summary = "获取首页数据")
    @GetMapping("/index")
    public AjaxResult index() {

        //获取首页一级商品分类列表
        List<CategoryVo> categoryVoList = categoryService.getLevelOneCategory();


        //TODO 获取首页热销商品列表
        List<ProductSkuVo> topSaleList = productSkuService.getTopSale();

        IndexDataVo indexDataVo = new IndexDataVo();
        indexDataVo.setCategoryList(categoryVoList);
        indexDataVo.setProductSkuList(topSaleList);
        return success(indexDataVo);
    }

    @Operation(summary = "获取分类嵌套列表")
    @GetMapping( "/category")
    public AjaxResult category() {
        return success(categoryService.tree());
    }

    @Operation(summary = "显示商品列表")
    @GetMapping("/skuList/{pageNum}/{pageSize}")
    public TableDataInfo skuList(
            @Parameter(description = "当前页码")
            @PathVariable Integer pageNum,

            @Parameter(description = "每页记录数")
            @PathVariable Integer pageSize,

            SkuQuery skuQuery) {

        PageHelper.startPage(pageNum, pageSize);
        List<ProductSkuVo> list = productSkuService.selectProductSkuList(skuQuery);
        return getDataTable(list);
    }

    @Operation(summary = "获取全部品牌")
    @GetMapping("/brand")
    public AjaxResult selectBrandAll() {
        return success(brandService.list());
    }

    @Operation(summary = "商品详情")
    @GetMapping("/item/{skuId}")
    public AjaxResult item(
            @Parameter(description = "skuId")
            @PathVariable Long skuId) {

        //查询商品时，先从bitmap中查询，id是否存在
        String key = "product:sku:data";
        Boolean flag = redisTemplate.opsForValue().getBit(key, skuId);
        if(!flag){
            log.error("商品sku不存在：" + skuId);
            throw new ServiceException("商品不存在");
        }

        //创建数据对象
        ItemVo itemVo = new ItemVo();

        //获取商品sku
        ProductSku productSku = productSkuService.getProductSku(skuId);
        itemVo.setProductSku(productSku);

        //获取商品id
        Long productId = productSku.getProductId();

        //获取商品
        Product product = productService.getById(productId);
        //获取商品轮播图列表
        String[] sliderUrlList = product.getSliderUrls().split(",");
        itemVo.setSliderUrlList(sliderUrlList);

        //获取商品规格信息json字符串
        JSONArray specValueList = JSON.parseArray(product.getSpecValue());
        itemVo.setSpecValueList(specValueList);

        //根据skuId获取商品sku价格
        itemVo.setSkuPrice(productSkuService.getSkuPrice(skuId));

        //根据skuId获取商品库存信息
        itemVo.setSkuStock(skuStockService.getSkuStock(skuId));

        //获取商品详情图片
        String[] detailsImageUrlList = productDetailsService.getProductDetails(productId);
        itemVo.setDetailsImageUrlList(detailsImageUrlList);

        //获取商品规格map
        Map<String, Long> skuSpecValueMap = productSkuService.getSkuSpecValue(productId);
        itemVo.setSkuSpecValueMap(skuSpecValueMap);



        return success(itemVo);
    }
}
